﻿/*
 * 5-10-2010 - Alowan Hermes - 0922412
 * 
 * */
using System;
using System.Collections.Generic;
using System.Drawing;
using Roborally.CommonData.Enums;
using Roborally.CommonData.GlobaleTypes;
using Roborally.Scheidsrechter;

namespace Roborally.Spelleider
{
    /// <summary>
    /// moet internal zijn
    /// </summary>
    public class SpelerInfo
    {
        #region Fields en Properties

        private bool alleKaartenInProgrammeerBaai = false;
        public bool AlleKaartenInProgrammeerBaai { get { return alleKaartenInProgrammeerBaai; } }

        public event EventHandler AlleKaartenNeergelegd;
        private int id;
        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        bool isPowerDown;
        public bool PowerDown { get { return isPowerDown; } }
        bool isDood;
        public bool Dood { get { return isDood; } }
        int schade;
        public int Schade
        {
            get { return schade; }
            internal set
            {
                if (value >= 9)
                {
                    Levens -= 1;
                }
                else
                {
                    schade = value;
                }
            }
        }
        int levens;
        public int Levens
        {
            get { return levens; }
            internal set
            {
                if (value > 0)
                {
                    if (levens > value)
                    {
                        locatie = new Point(-1, -1);
                    }
                    levens = value;
                }
                else
                    isDood = true;
            }
        }
        private Point oudeLocatie;
        public Point OudeLocatie { get { return oudeLocatie; } }
        Point locatie;
        public Point Locatie
        {
            get { return locatie; }
            internal set
            {
                oudeLocatie = locatie;
                locatie = value;
            }
        }
        private Richting richting;
        public Richting Richting { get { return richting; } set { richting = value; } }
        private Point respawnLocatie;
        public Point RespawnLocatie
        {
            get { return respawnLocatie; }
            internal set { respawnLocatie = value; }
        }

        int aantalBehaaldeVlaggen;
        public int AantalBehaaldeVlaggen { get { return aantalBehaaldeVlaggen; } internal set { aantalBehaaldeVlaggen = value; } }
        List<IProgramKaart> hand;
        private List<IProgramKaart> programmeerBaai;
        public List<IProgramKaart> ProgrammeerBaai { get { return programmeerBaai; } }

        private ISpeler ai;
        public ISpeler AI { get { return ai; } }
        public bool IsAI { get { return (ai != null); } }
        #endregion

        public SpelerInfo(int id)
        {
            this.id = id;
            levens = 3;
            programmeerBaai = new List<IProgramKaart>();
        }

        public SpelerInfo(int id, Point locatie)
            : this(id)
        {
            RespawnLocatie = locatie;
            this.locatie = locatie;
        }

        public SpelerInfo(int id, Point locatie, ISpeler AI)
            : this(id, locatie)
        {
            this.ai = AI;
        }

        /// <summary>
        /// Slaat de gegeven kaarten op in de hand
        /// </summary>
        /// <param name="kaarten">De kaarten die gegeven worden</param>
        public void KrijgtKaarten(List<IProgramKaart> kaarten)
        {
            hand = kaarten;
            programmeerBaai = new List<IProgramKaart>();
            for (int i = 0; i < 5 && i < kaarten.Count; i++)
                programmeerBaai.Add(null);
        }

        public void LegRandomKaartenNeer()
        {
            Random r = new Random();
            while (!AlleKaartenInProgrammeerBaai)
            {
                //Random kaart uit hand.
                IProgramKaart kaart = null;
                while (kaart == null)
                    kaart = hand[r.Next(hand.Count - 1)];

                //Lege plaats in programmeerBaai
                int plaats = -1;
                for (int i = 0; i < programmeerBaai.Count && plaats == -1; i++)
                {
                    if (programmeerBaai[i] == null)
                        plaats = i;
                }

                //Leg kaart van hand in programmeerBaai
                LegtKaartenNeer(kaart, plaats);
            }
            for (int i = 0; i < programmeerBaai.Count; i++)
            {

            }
            while (programmeerBaai.Count < 5)
            {
                int rand = r.Next(hand.Count - 1);
                IProgramKaart kaart = hand[rand];
            }
        }

        public IProgramKaart PeekKaartVanProgramBay(int index)
        {
            IProgramKaart k = programmeerBaai[index];
            return k;
        }

        /// <summary>
        /// Zet een SpelerInfo om naar SpelerGegevens (Nodig voor de Scheidsrechter)
        /// </summary>
        /// <returns></returns>
        public SpelerGegevens ToSpelerGegevens()
        {
            SpelerGegevens gegevens = new SpelerGegevens();
            gegevens.Positie = Locatie;
            gegevens.Richting = Richting;

            //Twan Wolthof - 0910740
            //Ik heb geen Base-type van ISpeler kunnen vinden. en kan dus ook geen instantie aan gegevens.Speler geven
            //Deze instantie zal moeten worden gemaakt met de informatie die hier bijdehand is.
            gegevens.Speler = id;
            //---

            gegevens.LaatstBehaaldeVlag = aantalBehaaldeVlaggen;
            return gegevens;
        }

        /// <summary>
        /// Onnodige methode voor testen
        /// </summary>
        /// <returns></returns>
        public string GetKaarten()
        {
            string s = "";
            foreach (ProgramKaart k in hand)
                s += k.ToString() + "\r\n";
            return s;
        }

        /// <summary>
        /// Legt gegeven kaarten neer op de program bay
        /// </summary>
        /// <param name="kaarten"></param>
        public void LegtKaartenNeer(IProgramKaart kaart, int plaats)
        {
            if (kaart != null && plaats >= 0 & plaats < programmeerBaai.Count)
            {
                bool kaartVerwijderd = false;
                for (int i = 0; i < Hand.Count && !kaartVerwijderd; i++)
                {
                    if (Hand[i] != null)
                    {
                        if (Hand[i].Prioriteit == kaart.Prioriteit)
                        {
                            Hand[i] = null;
                            kaartVerwijderd = true;
                        }
                    }
                }
                if (kaartVerwijderd)
                {
                    programmeerBaai[plaats] = kaart;
                    alleKaartenInProgrammeerBaai = true;
                    for (int i = 0; i < programmeerBaai.Count && alleKaartenInProgrammeerBaai; i++)
                    {
                        alleKaartenInProgrammeerBaai = (programmeerBaai[i] != null);
                    }
                }
            }
        }

        //public bool IsAI;

        public List<IProgramKaart> Hand { get { return hand; } }
    }
}